package com.huashi.dealer.core.util;

import cn.dev33.satoken.stp.StpUtil;
import com.huashi.dealer.commonEntity.StoreUser;
import com.huashi.dealer.commonEntity.User;

import static cn.dev33.satoken.stp.StpUtil.isLogin;

public class SaTokenUtil {

    // 用户类型前缀常量
    private static final String USER_PREFIX = "user_";
    private static final String STORE_USER_PREFIX = "store_";

    // 用户类型枚举
    public enum UserType {
        DEALER("dealer"), STORE_USER("store_user");

        private final String value;

        UserType(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }

    /**
     * 用户登录并生成Token
     *
     * @param user 用户信息
     * @return 生成的Token
     */
    public static String login(User user) {
        // 使用前缀区分用户ID，避免与业务员ID冲突
        String loginId = USER_PREFIX + user.getUserId();
        StpUtil.login(loginId);

        // 获取生成的Token
        String token = StpUtil.getTokenValue();

        // 设置用户信息到Token中
        StpUtil.getSession().set("userInfo", user);
        StpUtil.getSession().set("userType", UserType.DEALER.getValue());

        return token;
    }

    /**
     * 业务员登录并生成Token
     *
     * @param storeUserId 业务员ID
     * @return 生成的Token
     */
    public static String login(Long storeUserId) {
        // 使用前缀区分业务员ID，避免与用户ID冲突
        String loginId = STORE_USER_PREFIX + storeUserId;
        StpUtil.login(loginId);

        // 获取生成的Token
        String token = StpUtil.getTokenValue();
        StpUtil.getSession().set("userType", UserType.STORE_USER.getValue());
        return token;
    }

    /**
     * 业务员登录并生成Token（带业务员信息）
     *
     * @param storeUser 业务员信息
     * @return 生成的Token
     */
    public static String login(StoreUser storeUser) {
        // 使用前缀区分业务员ID，避免与用户ID冲突
        String loginId = STORE_USER_PREFIX + storeUser.getStoreUserId();
        StpUtil.login(loginId);

        // 获取生成的Token
        String token = StpUtil.getTokenValue();

        // 设置业务员信息到Token中
        StpUtil.getSession().set("storeUserInfo", storeUser);
        StpUtil.getSession().set("userType", UserType.STORE_USER.getValue());

        return token;
    }
    /**
     * 获取当前登录用户ID
     *
     * @return 用户ID
     */
    public static Long getLoginId() {
        String loginId = (String) StpUtil.getLoginId();
        if (loginId == null) {
            return null;
        }

        // 根据前缀判断用户类型并返回实际ID
        if (loginId.startsWith(USER_PREFIX)) {
            return Long.parseLong(loginId.substring(USER_PREFIX.length()));
        } else if (loginId.startsWith(STORE_USER_PREFIX)) {
            return Long.parseLong(loginId.substring(STORE_USER_PREFIX.length()));
        }

        return null;
    }

    /**
     * 获取当前登录用户信息
     *
     * @return 用户信息
     */
    public static User getLoginUser() {
        if (!isLogin()) {
            return null;
        }
        return (User) StpUtil.getSession().get("userInfo");
    }

    /**
     * 获取当前登录业务员信息
     *
     * @return 业务员信息
     */
    public static com.huashi.dealer.commonEntity.StoreUser getLoginStoreUser() {
        if (!isLogin()) {
            return null;
        }
        return (com.huashi.dealer.commonEntity.StoreUser) StpUtil.getSession().get("storeUserInfo");
    }

    /**
     * 强制用户下线
     *
     * @param userId 用户ID
     */
    public static void kickout(Long userId) {
        StpUtil.kickout(USER_PREFIX + userId);
    }

    /**
     * 强制业务员下线
     *
     * @param storeUserId 业务员ID
     */
    public static void kickoutStoreUser(Long storeUserId) {
        StpUtil.kickout(STORE_USER_PREFIX + storeUserId);
    }

    /**
     * 根据Token获取用户ID
     *
     * @param token Token值
     * @return 用户ID
     */
    public static Long getUserIdByToken(String token) {
        try {
            // 临时切换Token来获取用户ID
            String originalToken = StpUtil.getTokenValue();

            // 切换到指定Token
            StpUtil.switchTo(token);

            // 检查Token是否有效
            if (!StpUtil.isLogin()) {
                return null;
            }

            // 获取用户ID
            Long userId = getLoginId();

            // 切换回原始Token
            if (originalToken != null) {
                StpUtil.switchTo(originalToken);
            }

            return userId;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 根据Token获取用户信息
     *
     * @param token Token值
     * @return 用户信息
     */
    public static User getUserByToken(String token) {
        try {
            // 临时切换Token来获取用户信息
            String originalToken = StpUtil.getTokenValue();

            // 切换到指定Token
            StpUtil.switchTo(token);

            // 检查Token是否有效
            if (!StpUtil.isLogin()) {
                return null;
            }

            // 获取用户信息
            User user = (User) StpUtil.getSession().get("userInfo");

            // 切换回原始Token
            if (originalToken != null) {
                StpUtil.switchTo(originalToken);
            }

            return user;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 根据Token获取业务员信息
     *
     * @param token Token值
     * @return 业务员信息
     */
    public static StoreUser getStoreUserByToken(String token) {
        try {
            // 临时切换Token来获取业务员信息
            String originalToken = StpUtil.getTokenValue();

            // 切换到指定Token
            StpUtil.switchTo(token);

            // 检查Token是否有效
            if (!StpUtil.isLogin()) {
                return null;
            }

            // 获取业务员信息
            StoreUser storeUser = (StoreUser) StpUtil.getSession().get("storeUserInfo");

            // 切换回原始Token
            if (originalToken != null) {
                StpUtil.switchTo(originalToken);
            }

            return storeUser;
        } catch (Exception e) {
            return null;
        }
    }
    /**
     * 获取当前登录用户类型
     *
     * @return 用户类型
     */
    public static UserType getLoginUserType() {
        if (!isLogin()) {
            return null;
        }
        String userType = (String) StpUtil.getSession().get("userType");
        if (UserType.DEALER.getValue().equals(userType)) {
            return UserType.DEALER;
        } else if (UserType.STORE_USER.getValue().equals(userType)) {
            return UserType.STORE_USER;
        }
        return null;
    }

    /**
     * 判断当前登录用户是否为经销商
     *
     * @return true为经销商，false不是
     */
    public static boolean isDealer() {
        UserType userType = getLoginUserType();
        return UserType.DEALER.equals(userType);
    }

    /**
     * 判断当前登录用户是否为业务员
     *
     * @return true为业务员，false不是
     */
    public static boolean isStoreUser() {
        UserType userType = getLoginUserType();
        return UserType.STORE_USER.equals(userType);
    }

    /**
     * 获取当前登录用户类型字符串
     *
     * @return 用户类型字符串（dealer/store_user）
     */
    public static String getLoginUserTypeString() {
        UserType userType = getLoginUserType();
        return userType != null ? userType.getValue() : null;
    }
}